package site.assad.dynamicProxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * Author: Al-assad 余林颖
 * E-mail: yulinying_1994@outlook.com
 * Date: 2017/12/5 0:15
 * Description: 基于CGLib的动态代理：编写 FooServcieImpl 中提取出来的横切逻辑代码的代理创建器（增强类）
 */
public class CglibProxy implements MethodInterceptor{

    private Enhancer enhancer = new Enhancer();   //增强器对象

    public Object getProxy(Class clazz){
        enhancer.setSuperclass(clazz);   //设置需要创建子类的类
        enhancer.setCallback(this);
        return enhancer.create();   //通过字节码技术动态创建子类实例
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        PerformanceMonitor.begin(obj.getClass().getName()+"."+method.getName());   //开始测试
        Object result = proxy.invokeSuper(obj,args);      //通过代理类调用父类中的方法
        PerformanceMonitor.end();   //结束测试
        return result;
    }
}
